/*两两交换链表中的节点
 （讲座太无聊，听着听着就想了个题目，我真牛）
效率很高，但是内存太大了
不会递归，等会了再修改
 */


struct ListNode* swapPairs(struct ListNode* head){
if(head==NULL||head->next==NULL)
return head;
struct ListNode* p=head,* q=head,* x=head;
struct ListNode* tmp=malloc(sizeof(struct ListNode));
tmp->val=1;
tmp->next=head;
struct ListNode* Length=head;
int length=0;
    while(Length!=NULL){
        length++;
        Length=Length->next;
    }
if(p->next!=NULL)
q=p->next;
x=tmp;
while(q&&q->next)//我也想直接把最后一个反转过来，但是如果不加q->next!=NULL就会报错，加了就转不过来，只好后面转了
{
  p->next=q->next;
  q->next=p;
  x->next=q;
  p=p->next;
  q=p->next;
  x=x->next;
  x=x->next;
}
if (length%2==0)//如果是偶数个节点，就反转最后两个节点
{
x=tmp;
for(int i=0;i<length-2;i++)
{
  x=x->next;
}
p=x->next;
q=p->next;
q->next=p;
x->next=q;
p->next=NULL;
}
return tmp->next;
}